package util

import (
	"fmt"
	"io/fs"
	"log"
	"os"
	"runtime/debug"
	"time"
)

// 异常处理
func TryE(tag string) {
	errs := recover()
	if errs == nil {
		return
	}

	now := time.Now()  // 获取当前时间
	pid := os.Getpid() // 获取进程ID

	timeFormat := now.Format("20060102150405")                           // 设定时间格式
	fileName := fmt.Sprintf("[%s]-%d-%s-dump.log", tag, pid, timeFormat) // 保存错误信息文件名:程序名-进程ID-当前时间（年月日时分秒）
	log.Println("dump to file", fileName)

	os.MkdirAll("log/try", fs.ModeDir)
	f, err := os.Create("log/try/" + fileName)
	if err != nil {
		log.Println(err)
		log.Printf("%v\r\n", errs)
		log.Println("========")
		log.Println(string(debug.Stack()))
		return
	}
	defer f.Close()

	_, _ = f.WriteString(fmt.Sprintf("%v\r\n", errs)) // 输出panic信息
	_, _ = f.WriteString("========\r\n")
	_, _ = f.WriteString(string(debug.Stack())) // 输出堆栈信息
}
